草庐IT

Android ArrayList迭代

全部标签

C++如何将 map 迭代器仅公开给 map 的值

我有一些模板可以将map或vector作为底层容器。我希望模板能够向元素公开const迭代器。我读过的关于如何公开迭代器的大部分信息(例如thisaccuarticle)都使用的形式typedefstd::vector::iteratoriterator;typedefstd::vector::const_iteratorconst_iterator;iteratorbegin(){returnvalues.begin();}iteratorend(){returnvalues.end();}虽然这对于使用映射的模板来说并不真正有效,因为要访问元素,模板不能再使用it->SomeMem

c++ - 带有 Vector 迭代器的多线程

我已经将一个vector声明为typedefstd::vectorSampleList;并在类中声明了Samplist类型的成员变量。我正在从另一个具有多线程的类访问这个vector。我正在添加、删除、读取来自不同线程的值。我经常像下面这样读取这个值。SampleList*listSample;listSample=ptr->GetList();while(true){SampleList::iteratoritrSample;itrSample=listSample->begin();unsignedintnId=0;for(;itrSampleend();++itrSample){

c++ - 没有从 const_iterator 类型的返回值到迭代器的可行转换

灵感来自Antony'sWilliams"C++ConcurrencyinAction"我想仔细看看他的线程安全HashMap。我复制了它的代码并添加了一些输出运算符,这就是我想出的:#include#include#include#include#includetemplate>classthread_safe_hashmap{private:classbucket_type{public:typedefstd::pairbucket_value;typedefstd::listbucket_data;typedeftypenamebucket_data::iteratorbucke

c++ - C++ 中的列表迭代器不可递增错误消息

作为新手,我正在尝试使用列表类在C++中实现排序功能。然而,运行代码我得到列表迭代器不可递增的错误......但是它似乎不太可能因为它应该是可递增的!代码:voidshuffle(list&list1){listsmaller;listlarger;if(list1.size()>1){list::iteratorit;//intit;intx=list1.front();for(it=list1.begin();it!=list1.end();it++){if(*it我只是在deCPP文件中实现了这个功能,在main.有人有什么建议吗? 最佳答案

c++ - 使用 swap-and-pop 迭代时删除 vector 中的元素

我想在迭代vector时删除某些元素,但下面的代码导致“vector迭代器不可递增”断言失败。for(autoiter=vec.begin();iter!=vec.end();++iter){if((*iter).isDead()){std::swap(*iter,vec.back());//swapwiththebackvec.pop_back();//erasetheelement}}这段代码有什么问题? 最佳答案 只有在该次迭代中不删除任何元素时才应增加迭代器:for(autoiter=vec.begin();iter!=ve

c++ - 我是否需要知道算法的代码才能利用插入器和移动迭代器?

C++Primer(第5版)给出了一些通过传递inserter或moveiterator而不是std的通用算法的常规迭代器。但是,我怀疑能否做到这一点取决于对算法工作原理的内部知识,即算法对其迭代器参数的精确处理。这对于moveinserter来说更加严重,因为我们需要确保对象在被移动之后不会被访问。我的怀疑有道理吗?如果是,那么标准库为何采用要求客户端(我)了解提供程序(STL)内部结构的方法? 最佳答案 不,您不需要了解任何STL算法的实现,因为它们在国际标准中有一般规定的要求。例如,std::remove()声明为:templ

c++ - 迭代器失效规则是否意味着线程安全?

HereinthisStackOverflowanswer它列出了C++11中标准容器的迭代器失效规则。特别是插入:[multi]{set,map}:所有迭代器和引用不受影响[23.2.4/9]unordered_[multi]{set,map}:所有迭代器在重新哈希发生时失效,但引用不受影响[23.2.5/8]。如果插入不会导致容器的大小超过z*B,则不会发生重新散列,其中z是最大负载因子,B是当前的桶的数量。[23.2.5/14]删除:[multi]{set,map}和unordered_[multi]{set,map}:只有对被删除元素的迭代器和引用无效这些规则是否意味着我可以在

c++ - 为什么 std::vector 迭代器在 erase() 调用后失效?

C++引用明确指出,在迭代器上调用std::vector::erase(it)将使指向和之后指向被删除元素的所有迭代器失效。http://en.cppreference.com/w/cpp/container/vector/erase我确实理解为什么这样的迭代器在erase调用后变得不可取消引用,但我很好奇为什么它们需要变得无效,需要哪些实现细节?例如,标准规定std::vector必须使用连续存储的元素来实现,元素不仅可以通过迭代器访问,还可以使用指向元素的常规指针的偏移量因此,此类容器的迭代器可能会实现为指针似乎合乎逻辑-但指针如何变得无效? 最佳答案

c++ - 检查容器模板类中的迭代器类型

我正在编写一个容器类,并希望提供一个将迭代器作为参数的构造函数,但前提是基础迭代类型与容器类型匹配。所以我写道:templateclassBuffer{public:templatetypenamestd::enable_if::value_type,typenameT>>::typeBuffer(InputIterfirst,InputIterlast){}};但是我有编译错误说模板参数1和2无效怎么了?此处使用编译器编写代码:https://onlinegdb.com/SyIqN_mBG 最佳答案 快到了。您需要记住的是,正如您

c++ - 通过常量迭代器从 STL 容器中删除

根据C++referenceSTL容器已在C++11标准中修复,以在erase方法中采用常量迭代器。以下代码无法在启用c++0x的g++4.7中编译。#includeintmain(){std::vectorvector;vector.push_back(0);std::vector::const_iteratorvectorItr=vector.begin();vector.erase(vectorItr);}显然新的签名没有实现。有没有什么时候解决这个问题的信息?我在C++0x/C++11SupportinGCC中找不到任何相关信息文章。 最佳答案